벡터 데이터베이스
벡터 데이터베이스 (Vector Database)
비정형 데이터를 임베딩 벡터로 변환하여 저장하고, 의미 기반 유사도 검색(k-NN)을 고속으로 수행하는 데이터베이스 시스템.
데이터 유형
| 유형 | 특징 | 예시 |
|---|---|---|
| 정형 (Structured) | 엄격한 스키마, 테이블 구조 | RDBMS, CSV |
| 반정형 (Semi-structured) | 스키마 포함하지만 유연 | JSON, XML |
| 비정형 (Unstructured) | 구조 없음, 전체 데이터 80% 이상 | 텍스트, 이미지, 음성 |
벡터 DB는 비정형 데이터 처리에 특화.
벡터 임베딩 (Vector Embedding)
비정형 데이터를 AI 모델(LLM 등)로 고차원 숫자 벡터로 변환하는 과정.
- 의미적으로 유사한 데이터 → 벡터 공간에서 가까운 위치에 매핑
- 컴퓨터가 숫자 연산으로 의미적 유사성을 판단할 수 있게 됨
벡터 인덱싱 (Vector Indexing)
전체 탐색(Exhaustive Search) 비효율 → 인덱스로 후보 추려냄.
주요 알고리즘
| 알고리즘 | 방식 | 특징 |
|---|---|---|
| LSH (Locality-Sensitive Hashing) | 유사한 벡터가 같은 버킷에 충돌하도록 설계된 해시 | 재현율 향상 위해 복수 해시 함수 사용 |
| PQ (Product Quantization) | 고차원 벡터를 저차원 조각으로 분할 → 코드북으로 압축 | 메모리 절감, 검색 속도 향상 |
| HNSW (Hierarchical Navigable Small World) | 벡터를 노드, 거리를 엣지로 하는 계층적 그래프 | 현재 가장 널리 사용되는 고성능 알고리즘 |
유사도 척도
- 코사인 유사도: 방향성 유사도 측정 (크기 무관) → 검색·추천 시스템에서 가장 널리 사용
DB 유형 비교
| 구분 | RDBMS | 전문 검색 (Full-Text) | 벡터 DB |
|---|---|---|---|
| 검색 방식 | 일치값, 조건 검색 | 역색인 기반 키워드 (TF-IDF, BM25) | k-NN 유사도 (ANN, HNSW) |
| 실제 쿼리 | SELECT * FROM ... |
MATCH(body) AGAINST('keyword') |
collection.search(query_vector, k=5) |
| 유사성 판단 | 없음 (정확 일치) | 어휘적 유사성 | 의미적·맥락적 유사성 |
| 주요 용도 | 정형 데이터, 트랜잭션 | 문서, 웹페이지 검색 | 이미지, 추천, 챗봇 |
주요 벡터 DB 비교
| DB | 유형 | 저장 방식 | 인덱싱 |
|---|---|---|---|
| Pinecone | 완전 관리형 클라우드 | 분산 Blob Storage | 자체 ANN, 자동 최적화 |
| Milvus | 오픈소스 분산형 | 세그먼트 단위 객체 스토리지 | HNSW/IVF_FLAT/IVF_PQ 수동 선택 |
| Weaviate | 오픈소스 분산형 | 로컬 디스크 (LSM Tree) | HNSW 기본, RAM 상주 |
| Chroma | 오픈소스 인-프로세스 | 로컬 SQLite | HNSW 기본, 자동 업데이트 |
| Faiss | 오픈소스 라이브러리 | 인메모리 (파일 저장 가능) | Flat/IVF/HNSW/PQ 수동 제어 |
미니 벡터 DB 설계 (SQLite + LSH)
핵심 함수
init(vector_size) // DB 초기화
add([(id, vector, metadata), ...]) // 벡터 추가
delete(ids) // 삭제
query(vector, k) // k-NN 검색
스키마 설계
-- 원본 벡터 저장
CREATE TABLE vectors (
id TEXT PRIMARY KEY,
vector_data BLOB, -- 벡터 (바이너리)
metadata TEXT -- JSON
);
-- LSH 인덱스 (1:N 관계)
CREATE TABLE lsh_index (
hash_value TEXT,
vector_id TEXT REFERENCES vectors(id) ON DELETE CASCADE
);
CREATE INDEX idx_hash ON lsh_index(hash_value);
핵심: 하나의 벡터 → 여러 LSH 함수 → 여러 hash_value 생성
검색 시 hash 매칭 → 후보 추출 → 정확한 거리 계산
Node.js 프로파일링 도구
Chrome DevTools
node --inspect your_script.js
# chrome://inspect → inspect 클릭
- CPU 플레임 그래프, 메모리 스냅샷 지원
코드 내 측정
import { performance } from 'perf_hooks';
const start = performance.now();
await task();
console.log(`${(performance.now() - start).toFixed(3)} ms`);
// 메모리
const before = process.memoryUsage().heapUsed;
// ... 작업 ...
const used = (process.memoryUsage().heapUsed - before) / 1024 / 1024;
console.log(`${used.toFixed(3)} MB`);
Clinic.js
npm install -g clinic
clinic flame -- node your_script.js
# → HTML 리포트 자동 생성
관련 개념
- 파인튜닝 — 임베딩 모델 학습
- 이벤트 루프와 Pub-Sub — Node.js 비동기 처리